#Использовать tempfiles
#Использовать logos
#Использовать v8runner
#Использовать fs
#Использовать 1commands

Перем ПутьКПлатформе1С;
Перем СборкаЧерезУтилитуАвтономногоСервера;
Перем ИмяФайлаУтилитыАвтономногоСервера;
Перем ИмяФайлаЗапускаКонфигуратора;

Перем ИмяФайлаМинимальнойКонфигурации;
Перем ИмяКаталогаВременнойБазы;

Перем Лог;
Перем МенеджерВременныхФайлов;

Процедура УстановитьПутьКПлатформе1С(НовыйПуть) Экспорт
	ПутьКПлатформе1С = НовыйПуть;
	
	ИмяФайлаУтилитыАвтономногоСервера = ОбъединитьПути(ПутьКПлатформе1С, "ibcmd"+?(ОбщиеМетоды.ЭтоWindows(),".exe",""));
	
	ФайлУтилиты = Новый Файл(ИмяФайлаУтилитыАвтономногоСервера);
	СборкаЧерезУтилитуАвтономногоСервера = ФайлУтилиты.Существует();
	
	ИмяФайлаЗапускаКонфигуратора = ОбъединитьПути(ПутьКПлатформе1С,"1cv8"+?(ОбщиеМетоды.ЭтоWindows(),".exe",""));
КонецПроцедуры

Процедура УстановитьИмяКаталогаВременнойБазы(ПутьКБазе) Экспорт
	ИмяКаталогаВременнойБазы = ПутьКБазе;
КонецПроцедуры

Процедура СоздатьФайловуюБазу() Экспорт
	Если СборкаЧерезУтилитуАвтономногоСервера Тогда
		АвтономныйСоздатьФайловуюБазу(ИмяКаталогаВременнойБазы);
	Иначе
		
		Конфигуратор = ПодготовленныйКонфигуратор(Ложь);
		Конфигуратор.СоздатьФайловуюБазу(ИмяКаталогаВременнойБазы);
		
	КонецЕсли;
КонецПроцедуры

Процедура ЗагрузитьКонфигурациюИзФайлов(КаталогВыгрузки, ИмяРасширения = "") Экспорт
	Если СборкаЧерезУтилитуАвтономногоСервера Тогда
		АвтономныйЗагрузитьКонфигурациюИзФайлов(КаталогВыгрузки, ИмяРасширения);
	Иначе
		Конфигуратор = ПодготовленныйКонфигуратор();
		
		Если ЗначениеЗаполнено(ИмяРасширения) Тогда
			Конфигуратор.ЗагрузитьРасширениеИзФайлов(КаталогВыгрузки, ИмяРасширения);
		Иначе
			ПараметрыЗапуска = Конфигуратор.ПолучитьПараметрыЗапуска();
			ПараметрыЗапуска.Добавить(СтрШаблон("/LoadConfigFromFiles ""%1""", КаталогВыгрузки)); 
			
			Конфигуратор.ВыполнитьКоманду(ПараметрыЗапуска);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

Процедура ВыгрузитьКонфигурациюВФайл(ИмяРезультирующегоФайла, ИмяРасширения = "") Экспорт
	Если СборкаЧерезУтилитуАвтономногоСервера Тогда
		АвтономныйВыгрузитьКонфигурациюВФайл(ИмяРезультирующегоФайла, ИмяРасширения, Истина);
	Иначе
		
		Конфигуратор = ПодготовленныйКонфигуратор();
		
		Если ЗначениеЗаполнено(ИмяРасширения) Тогда
			Конфигуратор.ВыгрузитьРасширениеВФайл(ИмяРезультирующегоФайла,  ИмяРасширения);
		Иначе
			Конфигуратор.ВыгрузитьКонфигурациюВФайл(ИмяРезультирующегоФайла);
		КонецЕсли;
		
	КонецЕсли;
КонецПроцедуры

Процедура ВыполнитьСозданиеБинарногоФайлаРасширения(КаталогИсходныхФайловРасширения,ИмяФайлаРасширения, ИмяРасширенияВБазе) Экспорт
	ИмяКаталогаВременнойБазы = МенеджерВременныхФайлов.СоздатьКаталог();
	ФС.ОбеспечитьКаталог(ИмяКаталогаВременнойБазы);
	
	УстановитьИмяКаталогаВременнойБазы(ИмяКаталогаВременнойБазы);
	Лог.Информация(СтрШаблон("Создаю временную базу %1", ИмяКаталогаВременнойБазы));
	СоздатьФайловуюБазу();
	
	Лог.Информация(СтрШаблон("Загружаю исходные файлы в базу"));
	ЗагрузитьКонфигурациюИзФайлов(КаталогИсходныхФайловРасширения, ИмяРасширенияВБазе);
	ВыгрузитьКонфигурациюВФайл(ИмяФайлаРасширения, ИмяРасширенияВБазе);
	
	МенеджерВременныхФайлов.Удалить();
	УдалитьФайлы(МенеджерВременныхФайлов.БазовыйКаталог);
	
КонецПроцедуры	

Процедура СформироватьБинарныйФайлОбработки(ИмяИсходногоФайлаОбработки, ИмяФайлаОбработки) Экспорт
	Если СборкаЧерезУтилитуАвтономногоСервера Тогда
	Иначе
		Конфигуратор = ПодготовленныйКонфигуратор();
		ПараметрыЗапуска = Конфигуратор.ПолучитьПараметрыЗапуска();
		ПараметрыЗапуска.Добавить("/LoadExternalDataProcessorOrReportFromFiles """ + ИмяИсходногоФайлаОбработки + """  """ + ИмяФайлаОбработки + """");
		
		ИмяФайлаOut = МенеджерВременныхФайлов.СоздатьФайл("txt");
		ПараметрыЗапуска.Добавить("/Out """ + ИмяФайлаOut + """");
		
		Попытка
			Конфигуратор.ВыполнитьКоманду(ПараметрыЗапуска);
			// ТД = Новый ТекстовыйДокумент();
			// ТД.Прочитать(ИмяФайлаOut);
			// Лог.Информация(ТД.ПолучитьТекст());
		Исключение
			Лог.Ошибка("Ошибка сборки обработки " + ИмяИсходногоФайлаОбработки);
			Лог.Ошибка(ОписаниеОшибки());
			Лог.Ошибка(Конфигуратор.ВыводКоманды());
			ТД = Новый ТекстовыйДокумент();
			ТД.Прочитать(ИмяФайлаOut);
			Лог.Ошибка(ТД.ПолучитьТекст());
			ВызватьИсключение "Выгрузка обработок в xml прервана.";
		КонецПопытки;
	КонецЕсли;
КонецПроцедуры

Процедура УстановитьЛог(НовыйЛог) Экспорт
	Лог=НовыйЛог;
КонецПроцедуры

Процедура УстановитьКаталогВременныхФайлов(КаталогВременныхФайлов) Экспорт
	МенеджерВременныхФайлов.БазовыйКаталог = КаталогВременныхФайлов;
КонецПроцедуры

#Область УтилитаУправленияАвтономнымСервером

Процедура ВыполнитьКомандуЗапускаАвтономногоСервера(ПараметрыЗапуска)
	Команда = Новый Команда;
	Команда.ДобавитьЛогВыводаКоманды(Лог);
	Команда.УстановитьКоманду(""""+ИмяФайлаУтилитыАвтономногоСервера+"""");
	Для Каждого ТекПараметр Из ПараметрыЗапуска Цикл
		Команда.ДобавитьПараметр(ТекПараметр);
	КонецЦикла;
	Команда.ДобавитьПараметр("--db-path="""+ИмяКаталогаВременнойБазы+"""");
	
	Команда.ПоказыватьВыводНемедленно(Истина);    
	Команда.УстановитьКодировкуВывода(КодировкаТекста.UTF8);
	
	КодВозврата = Команда.Исполнить();
	
	Если КодВозврата <> 0 Тогда
		ВызватьИсключение "Ошибка исполнения команды запуска утилиты автономного сервера ";
	КонецЕсли;
	
КонецПроцедуры

Процедура АвтономныйСоздатьФайловуюБазу(ПутьКБазе, ЗагружатьМинимальнуюКонфигурацию = Ложь) 
	ПараметрыЗапуска = Новый Массив;
	ПараметрыЗапуска.Добавить("infobase");
	ПараметрыЗапуска.Добавить("create");
	ПараметрыЗапуска.Добавить("--create-database");
	ПараметрыЗапуска.Добавить("--force");
	ПараметрыЗапуска.Добавить("--apply");
	
	Если ЗагружатьМинимальнуюКонфигурацию Тогда
		ПараметрыЗапуска.Добавить("--load="""+ИмяФайлаМинимальнойКонфигурации+"""");
	КонецЕсли;
	
	ВыполнитьКомандуЗапускаАвтономногоСервера(ПараметрыЗапуска);
КонецПроцедуры

Процедура АвтономныйЗагрузитьКонфигурациюИзФайлов(КаталогВыгрузки, ИмяРасширения = "")
	ПараметрыЗапуска = Новый Массив;
	ПараметрыЗапуска.Добавить("infobase");
	ПараметрыЗапуска.Добавить("config");
	ПараметрыЗапуска.Добавить("import");
	
	Если ЗначениеЗаполнено(ИмяРасширения) Тогда
		ПараметрыЗапуска.Добавить("--extension="+ИмяРасширения);
	КонецЕсли;
	
	ПараметрыЗапуска.Добавить(""""+КаталогВыгрузки+"""");
	
	ВыполнитьКомандуЗапускаАвтономногоСервера(ПараметрыЗапуска);
КонецПроцедуры

Процедура АвтономныйВыгрузитьКонфигурациюВФайл(ФайлВыгрузки, ИмяРасширения = "", ОсновнаяКонфигурация = Ложь)
	ПараметрыЗапуска = Новый Массив;
	ПараметрыЗапуска.Добавить("infobase");
	ПараметрыЗапуска.Добавить("config");
	ПараметрыЗапуска.Добавить("save");
	Если ОсновнаяКонфигурация Тогда
		ПараметрыЗапуска.Добавить("--staging");
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ИмяРасширения) Тогда
		ПараметрыЗапуска.Добавить("--extension="+ИмяРасширения);
	КонецЕсли;
	
	ПараметрыЗапуска.Добавить(""""+ФайлВыгрузки+"""");
	
	ВыполнитьКомандуЗапускаАвтономногоСервера(ПараметрыЗапуска);
КонецПроцедуры

Процедура АвтономныйОбновитьконфигурациюИБ(ИмяРасширения = "")
	ПараметрыЗапуска = Новый Массив;
	ПараметрыЗапуска.Добавить("infobase");
	ПараметрыЗапуска.Добавить("config");
	ПараметрыЗапуска.Добавить("apply");
	ПараметрыЗапуска.Добавить("--force");
	
	Если ЗначениеЗаполнено(ИмяРасширения) Тогда
		ПараметрыЗапуска.Добавить("--extension="+ИмяРасширения);
	КонецЕсли;
	
	ВыполнитьКомандуЗапускаАвтономногоСервера(ПараметрыЗапуска);
КонецПроцедуры

Процедура АвтономныйСформироватьФайлОбработкиИзФайлов()
	
КонецПроцедуры

#КонецОбласти

#Область Конфигуратор

Функция ПодготовленныйКонфигуратор(УстанавливатьКонтекстБазы = Истина)
	Конфигуратор = Новый УправлениеКонфигуратором();
	Если ЗначениеЗаполнено(ИмяФайлаЗапускаКонфигуратора) Тогда
		Конфигуратор.ПутьКПлатформе1С(ИмяФайлаЗапускаКонфигуратора);
	КонецЕсли;
	
	Если УстанавливатьКонтекстБазы Тогда
		Конфигуратор.УстановитьКонтекст("/F" + ИмяКаталогаВременнойБазы, "", "");
	КонецЕсли;
	
	Возврат Конфигуратор;
КонецФункции

#КонецОбласти

ПутьКПлатформе1С = "";
СборкаЧерезУтилитуАвтономногоСервера = Ложь;

Лог = Новый Лог("app.build.tools_ui_1c");
МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов();

ИмяФайлаМинимальнойКонфигурации = ОбъединитьПути(ТекущийСценарий().Каталог, "..","Шаблоны","МинимальнаяКонфигурацияДляРазработки.cf");